#include <vector>
#include <stack>
#include <string>
#include <iostream>

using namespace std;


class Vertice;

enum Status {
  NOT_VISITED,
  VISITED
};
 
class Arista
  {
  private:
    Vertice *orgVertice;
    Vertice *dstVertice;
    float costo;
  public:
    Arista(Vertice *firstVertice, Vertice *secVertice, float inCosto)
    {
      orgVertice = firstVertice;
      dstVertice = secVertice;
      costo = inCosto;
    }
    Vertice* getDstVertice();
    Vertice* getOrgVertice();
    unsigned getCosto();
};

class Vertice
{
  private:
    string name;
    vector<Arista> adjVerticeList;
    enum Status status;
  public:
    Vertice(string id)
    {
    name = id;
    status = NOT_VISITED;
    }
    enum Status getStatus();
    void setStatus(enum Status st);
    string getName();
    void addAdjVertice(Vertice *adj, float costo);
    vector<Arista>& getAdjVerticeList();
    void displayList();
    void EliminarAristaConVertice(Vertice verAdyacente);
};

class Grafo
{
  private:
    vector<Vertice*> nodoList;
  public:
    Grafo(){}
    void mostrarGrafo();
    void borrarVisitados();
    void agregarVertice(Vertice *nVertice);
    Vertice* buscarVerticePorNombre(string name);
};
